In a typical computer system, devices request services from system software by generating interrupt requests, which are propagated to an interrupt controller via multiple interrupt request lines. Once the interrupt controller identifies an active interrupt request line, it may send an interrupt signal to the processor. In response, the processor determines whether the software is ready to receive the interrupt. If the software is not ready to receive the interrupt, the interrupt is held in a pending state until the software becomes ready. Once the software is determined to be ready, the processor performs an interrupt acknowledgment cycle on the processor bus to request that the interrupt controller report which of the pending interrupts is of the highest priority. The interrupt controller prioritizes among the various interrupt request lines and identifies the highest priority interrupt request to the processor. The processor uses this interrupt identifier, known as the interrupt vector, to search an interrupt descriptor table (IDT) for an interrupt descriptor pointing to code for handling this interrupt and then jumps to the handler code.
In a conventional operating system (OS), all the interrupts are controlled by a single entity known as an OS kernel. In a virtual machine system, a virtual-machine monitor (VMM) should have ultimate control over various operations and events occurring in the system to provide proper operation of virtual machines and for protection from and between virtual machines. To achieve this, the VMM typically receives control when guest software accesses a hardware resource or when certain events such as an interrupt or an exception occur. In particular, when a system device generates an interrupt, control may be transferred from the virtual machine to the VMM.